package openbang.account.service.intf;

import java.util.List;

import openbang.account.service.entity.UserAccount;
import openbang.account.service.vo.UserLoginInfo;
import openbang.common.vo.SelectModel;


import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
import com.google.gwt.user.client.rpc.ServiceDefTarget;

/**
 * 帐户服务
 * 1、注册
 * 2、登录
 * 3、找回密码、重置密码
 * 4、禁用用户
 * 5、列出所有用户
 * 6、消息处理（查询和发送、删除等）
 * 7、取出用户基本信息
 * 8、更新用户信息
 * 9、列出Session在线人员 from cache
 * @author aibozeng
 *
 */

@RemoteServiceRelativePath("accountService")
public interface AccountService extends RemoteService{

	/**
	 * 取出所有已经注册的用户信息
	 * @return
	 */
	public List<UserAccount> getAll();

	/**
	 * 取出所有已经注册的邮件地址
	 * @return
	 */
    public List<SelectModel> getAllEmail();

	/**
	 * 取出所有在线的用户信息（已登录或未登录）
	 * 从Cache中获取
	 * @return
	 */
    public List<UserLoginInfo> getAllSessionUser();
    
    /**
     * 检查帐户和密码的比对
     * @param email 帐户
     * @param pwd   密码
     * @return code 
     * @see AccountServiceEnum 
     */
    public Integer checkForLogin(String email,String pwd);
    
    /**
     * 注册新用户
     * @param account
     * @return code  OK , EXIST_EMAIL
     * @see AccountServiceEnum 
     */
    public Integer registerAccount(UserAccount account);
    
    /**
     * 检查 email是否被占用
     * @param email
     * @return code
     * @see AccountServiceEnum  OK , ERR_EMAIL
     */
    public Integer findEmail(String email);

    /**
     * 检查 email是否可以申请找回密码
     * @param email
     * @return code
     * @see AccountServiceEnum  OK ,ERR_EMAIL, ERR_FINDPWD
     */
    public Integer findEmail4FindPwd(String email);
    
    /**
     * 申请找回密码
     * @param email
     * @return code
     * @see AccountServiceEnum  OK , ERR_EMAIL ,ERR_FINDPWD 
     */
    public Integer applyFindPwd(String email);

    /**
     * 重置密码
     * @param applyId 申请单ID
     * @param  newPwd 新密码
     * @return code
     * @see AccountServiceEnum  OK , ERR_EMAIL ,ERR_FINDPWD 
     */
    public Integer setupNewPwd(Long applyId,String newPwd);
    
    /**
     * 获取当前用户的登录信息(已登录或未登录)
     * @param url 在JSP的JavaScript中声明的登录后要跳转的页面
     * @return
     */
    public UserLoginInfo getLoginUserInfo(String url);

    /**
     * 获取当前用户基本信息，包括头像位置，用于显示用户信息
     * @return
     */
    public UserAccount getUserAccount();
    
    /**
     * 更新用户信息
     * @param account
     * @return
     */
    public Integer updateUserAccount(UserAccount account);
    
    /* @RemoteServiceRelativePath相当于以下用法
     */
    public static class Util {
		private static AccountServiceAsync instance;
		public static AccountServiceAsync getInstance(){
			if (instance == null) {
				instance = (AccountServiceAsync) GWT.create(AccountService.class);
				ServiceDefTarget target = (ServiceDefTarget) instance;
				target.setServiceEntryPoint("/accountService");//GWT.getModuleBaseURL() 
			}
			return instance;
		}
	} 
	   //accountService 必须在 web.xml中声明
	  
}
